package com.example.chengbangming.chomeapp.utils;

import java.math.BigDecimal;
import java.text.DecimalFormat;


public class MathUtil {

	/**
     * 计算百分比
     *
     */
	public static String getPercent(int x, int total, String formatStr){
		return getPercent((long)x,(long)total,formatStr);
	}

	public static String getPercent(long x, long total, String formatStr){
	   String result="";//接受百分比的值
	   double tempresult=(double)x/(double)total;
	   DecimalFormat df1 = new DecimalFormat(formatStr);
	   result= df1.format(tempresult);
	   return result;
	}


	/**
	 * 计算比例
	 */
	public static double getScale(int x,int total){
		return getScale((long) x, (long) total);
	}

	public static double getScale(long x,long total){
//		String result="";//接受百分比的值
//		double tempresult=(double)x/(double)total;
//		DecimalFormat df1 = new DecimalFormat(formatStr);
//		result= df1.format(tempresult);
//		return result;
		return ((double)x/(double)total);
	}

	/**
	 * 按比例缩放x并转为int返回
	 */
	public static int countSizeByScale2Int(double x,double scale){
		return (int)countSizeByScale(x,scale);
	}

	public static double countSizeByScale(double x,double scale){
		return (x*scale);
	}

    //两差绝对值
    public static double getAbs(double a,double b){
        return Math.abs(sub(a,b));
    }

    // 默认除法运算精度
    private static final Integer DEF_DIV_SCALE = 2;

    /**
     * 提供精确的减法运算。
     *
     * @param value1
     *            被减数
     * @param value2
     *            减数
     * @return 两个参数的差
     */
    public static double sub(Number value1, Number value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue()));
        BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue()));
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确的加法运算。
     * @param value1 被加数
     * @param value2 加数
     * @return 两个参数的和
     */
    public static Double add(Number value1, Number value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue()));
        BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue()));
        return b1.add(b2).doubleValue();
    }

    /**
     * 提供精确的乘法运算。
     *
     * @param value1
     *            被乘数
     * @param value2
     *            乘数
     * @return 两个参数的积
     */
    public static Double mul(Number value1, Number value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue()));
        BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue()));
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 提供（相对）精确的除法运算，当发生除不尽的情况时， 精确到小数点以后10位，以后的数字四舍五入。
     *
     * @param dividend
     *            被除数
     * @param divisor
     *            除数
     * @return 两个参数的商
     */
    public static Double div(Double dividend, Double divisor) {
        return div(dividend, divisor, DEF_DIV_SCALE);
    }

    /**
     * 提供（相对）精确的除法运算。 当发生除不尽的情况时，由scale参数指定精度，以后的数字四舍五入。
     *
     * @param dividend
     *            被除数
     * @param divisor
     *            除数
     * @param scale
     *            表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static Double div(Double dividend, Double divisor, Integer scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(dividend));
        BigDecimal b2 = new BigDecimal(Double.toString(divisor));
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供精确的小数位四舍五入处理。
     *
     * @param value
     *            需要四舍五入的数字
     * @param scale
     *            小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static Double round(Double value, Integer scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(value));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 比较大小 浮点数
     *
     * @param val1
     *
     * @param val2
     *
     * @return 0 等于 1>2＝1  1<2=-1
     */
    public static int compare(Double val1, Double val2) {
        int result = 0;
        BigDecimal bval1 = new BigDecimal(val1);
        BigDecimal bval2 = new BigDecimal(val2);
        if (bval1.compareTo(bval2) < 0) {
            result = -1;//第一个小于第二个
        }
        if (bval1.compareTo(bval2) == 0) {
            result = 0;//两个相等
        }
        if (bval1.compareTo(bval2) > 0) {
            result = 1;//第一个大于第二个
        }
        return result;
    }
}